#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QVBoxLayout>
#include <QPainter>
#include <QTimer>
#include <stdint.h>
#include <cstdlib>
#include <ctime>
#include <QLabel>
#include <QDateTime>
#include <QKeyEvent>
#include <QDebug>


extern "C"
{
    #include "SCGUI_APP/sc_ui.h"
    #include "SCGUI/sc_gui.h"
    #include "SCGUI_APP/sc_ui_menu.h"
}

// 在窗口类中添加键盘事件处理
class MainWindowRgb : public QWidget
{

public:
    MainWindowRgb(QWidget* parent = nullptr) : QWidget(parent)
    {
        // ... 初始化界面的代码不变
    }
protected:
    void keyPressEvent(QKeyEvent* event) override
    {
        // 获取按键字符

        qDebug()<<event->key();
        //单个键
        if(event->key() == Qt::Key_Up)
        {
            set_key(1);
            qDebug()<<"上键按下";
        }
        else if(event->key() == Qt::Key_Down)
        {
            set_key(2);
            qDebug()<<"下键按下";
        }
        else if(event->key() == Qt::Key_Left)
        {
            set_key(3);
            qDebug()<<"左键按下";
        }
        else if(event->key() == Qt::Key_Right)
        {
            set_key(4);
            qDebug()<<"右键按下";
        }
        else if(event->key() == Qt::Key_Return)
        {
            set_key(5);
            qDebug()<<"确认键按下";
        }
        else if(event->key() == Qt::Key_Backspace)
        {
            set_key(6);
            qDebug()<<"退格键";
        }


        QWidget::keyPressEvent(event); // 调用基类的键盘事件处理
    }
private:
    QLabel* fpsLabel; // 存放 fpsLabel 的指针，方便在键盘事件中更新
};

// 自定义 QLabel 子类用于绘制自定义内容
class CustomLabel : public QLabel
{

public:
    CustomLabel(QWidget* parent = nullptr) : QLabel(parent)
    {
        width = LCD_SCREEN_WIDTH;
        height = LCD_SCREEN_HEIGHT;
        memset(pixels, 0, width * height * sizeof(uint16_t));  // 初始化为黑色
    }

    ~CustomLabel()
    {

    }

    // 在指定位置绘制一个点，颜色由 rgb565 给出
    void drawPixel(int x, int y, uint16_t rgb565)
    {
        if (x >= 0 && x < width && y >= 0 && y < height)
        {
            // 将颜色存储到缓冲区中
            pixels[y * width + x] = rgb565;
            update();  // 触发重绘
        }
    }

protected:
    void paintEvent(QPaintEvent* event) override
    {
        QPainter painter(this);
        for (int y = 0; y < height; y++)
        {
            for (int x = 0; x < width; x++)
            {
                uint16_t rgb565 = pixels[y * width + x];
                // 提取 RGB565 各分量
                uint8_t r = (rgb565 >> 11) & 0x1F;  // 5 位 R 分量
                uint8_t g = (rgb565 >> 5) & 0x3F;   // 6 位 G 分量
                uint8_t b = rgb565 & 0x1F;          // 5 位 B 分量

                // 将 RGB565 转换为 8 位每个分量的颜色（进行简单的线性扩展）
                r = (r * 255) / 31;
                g = (g * 255) / 63;
                b = (b * 255) / 31;
                painter.setPen(qRgb(r,g,b));
                painter.drawPoint(x, y);
            }
        }
    }


public:
    uint16_t pixels[LCD_SCREEN_WIDTH*LCD_SCREEN_HEIGHT];  // 存储颜色数据的缓冲区
    int width;         // 图像宽度
    int height;        // 图像高度
};

// 自定义的 QTimer 类用于定时绘制点
class CustomTimer : public QTimer
{

public:
    CustomTimer(CustomLabel* label, QLabel* fpsLabel, QObject* parent = nullptr) :
            QTimer(parent), label(label), fpsLabel(fpsLabel)
    {
        connect(this, &CustomTimer::timeout, this, &CustomTimer::scgui_run);
        lastTime = QDateTime::currentDateTime();
        frameCount = 0;
    }

    void get_fps()
    {
        // 计算 FPS
        QDateTime currentTime = QDateTime::currentDateTime();
        qint64 elapsedMS = lastTime.msecsTo(currentTime);
        frameCount++;

        if (elapsedMS >= 1000)
        {  // 每秒更新一次 FPS
            double fps = frameCount / (elapsedMS / 1000.0);
            fpsLabel->setText(QString("FPS: %1 \nLCD %2*%3").arg(fps, 0, 'f', 2).arg(LCD_SCREEN_WIDTH).arg(LCD_SCREEN_HEIGHT));
            lastTime = currentTime;
            frameCount = 0;
        }
    }

    void scgui_run()
    {

        //scgui_test();
        //show_zip_demo();
        //SC_GUI_test();
        menu_test();
        get_fps();
    }

private:

    CustomLabel* label;
    QLabel* fpsLabel;
    QDateTime lastTime;
    int frameCount;
};

// 创建自定义 QLabel
CustomLabel* customLabel;
static  void drawPixel(int x, int y, uint16_t rgb565)
{

    customLabel->drawPixel(x,y,rgb565);
}

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    MainWindowRgb window;
    window.resize(LCD_SCREEN_WIDTH, LCD_SCREEN_HEIGHT);

    QVBoxLayout* layout = new QVBoxLayout(&window);

    // 创建 FPS 标签
    QLabel* fpsLabel = new QLabel(QString("FPS: %1 \nLCD %2*%3").arg(0.0, 0, 'f', 2).arg(LCD_SCREEN_WIDTH).arg(LCD_SCREEN_HEIGHT));
    layout->addWidget(fpsLabel);

    customLabel = new CustomLabel();
    customLabel->setFixedSize(LCD_SCREEN_WIDTH, LCD_SCREEN_HEIGHT);
    customLabel->setStyleSheet("background-color: black;");
    layout->addWidget(customLabel);

    extern  lv_font_t lv_font_14;

    SC_GUI_Init(drawPixel,0,C_WHITE,C_RED,(lv_font_t*)&lv_font_14);

    SC_Clear(0,0,LCD_SCREEN_WIDTH-1,LCD_SCREEN_HEIGHT-1);

    // 创建定时器并设置定时时间间隔（例如 100 毫秒）
    CustomTimer* timer = new CustomTimer(customLabel,fpsLabel);
    timer->setInterval(20);  // 每 100 毫秒触发一次
    timer->start();

    window.show();
    setbuf(stdout, NULL);
    fflush(stdout);


    return app.exec();
}

